home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 157_01 / cmodem.c < prev    next >
Text File  |  1987-10-10  |  31KB  |  1,059 lines

  1. /*  HEADER:     CUGaaa.bb;
  2.     FILENAME:   cmodem.c;
  3.     TITLE:      Xmodem communications in c;
  4.     COMPILERS:  C86;
  5.     SYSTEM:     ms-dos;
  6.     AUTHORS:    Bill Rogers;
  7.     VERSION:    5.01;
  8.     DATE:       08/04/1985;
  9.     KEYWORDS:   commnications, xmodem, ms-dos, pc-dos, 8251a, 8530;
  10.     SEE-ALSO:   local.h;
  11.     DESCRIPTION:
  12.         "This program implements an elementary version of xmodem for
  13.         under ms-dos or pc-dos.";
  14.     WARNINGS:
  15.         "The zilog usart option is not yet tested.";
  16.  */
  17. /*      The calling sequence is:
  18.  *
  19.  *          cmodem
  20.  *
  21.  *      The control sequences are:
  22.  *
  23.  *          <ctrl-z><ctrl-z>    send <ctrl-z>
  24.  *          <ctrl-z>b300        set baud rate to 300 baud
  25.  *          <ctrl-z>b1200       set baud rate to 12000 baud
  26.  *          <ctrl-z>d           dial telephone number
  27.  *          <ctrl-z>e           exit without hangup
  28.  *          <ctrl-z>h           hangup without exit
  29.  *          <ctrl-z>i           initialize port & baud rate
  30.  *          <ctrl-z>nx...x      enter telephone number x...x
  31.  *          <ctrl-z>q           quit with hangup
  32.  *          <ctrl-z>rx...x      receive file name x...x
  33.  *          <ctrl-z>sx...x      send file name x...x
  34.  *          <ctrl-z>t           trace file transmissions
  35.  *          <ctrl-z>?           display commands
  36.  *
  37.  *      Revision history: Latest revision first.
  38.  *
  39.  *      12/Dec/84   Changed to C86 (Bill Rogers).
  40.  *      04/Jun/82   Removed PMMI defines and ifdef for Australia.  Much 
  41.  *                  more  extensive  documentation  added.  Modem  port 
  42.  *                  defines now obtained from BDSCIO.H.  Code tidied up 
  43.  *                  a  bit  and VARBAUD  ifdefs  added.  Some  messages 
  44.  *                  changed and numerous small changes ( Bill Bolton).
  45.  *      ??/???/81   Patched together from existing Cnet and YAM code
  46.  *                  (Steve Passe, Cnode SYSOP, USA).
  47.  *  SCCS IDENTIFICATION */
  48.         static char SCCSID[] = "@(#)cmodem.c  5.0.1";
  49. /*--------------------------------------------------------------------*/
  50. /*  INCLUDE */
  51. #define  EXTERN extern
  52. #include <local.h>
  53. #undef   EXTERN
  54. /*--------------------------------------------------------------------*/
  55. /*  DEFINE */
  56.  
  57. /*  Select USART interface type. */
  58.  
  59. #define     OCTAPORT            /* Lomas HAZITALL or Lomas OCTAPORT */
  60.  
  61. /*  ascii characters. */
  62.  
  63. #define     NUL         0x00
  64. #define     SOH         0x01
  65. #define     EOT         0x04
  66. #define     ACK         0x06
  67. #define     HT          0x09
  68. #define     LF          0x0a
  69. #define     CR          0x0d
  70. #define     NAK         0x15
  71. #define     CAN         0x18
  72. #define     SUB         0x1a    /*  ^Z */
  73. #define     ESC         0x1b
  74.  
  75. /*  Escape character for control. */
  76.  
  77. #define     ESCCHAR     0x1a    /*  ^Z */
  78.  
  79. #ifdef      HAZITALL
  80.  
  81. /*  Intel 8253 programmable interval timer definition. */
  82.  
  83. #define     CLOAD       0x8d    /*  load port. */
  84. #define     CCTRL       0x0f    /*  control port. */
  85. #define     CCTRLB      0x76    /*  select counter 1,
  86.                                     load lsb, then msb,
  87.                                     square wave generator,
  88.                                     binary counter. */
  89. #define     B0300       417     /*   300 baud. */
  90. #define     B1200       104     /*  1200 baud. */
  91.  
  92. /*  Intel 8251a serial port definition. */
  93.  
  94. #define     MDATA       0x84    /*  Data port. */
  95. #define     MSTAT       0x85    /*  Status port. */
  96. #define     MOMASK      0x01    /*  Output ready mask. */
  97. #define     MIMASK      0x02    /*  Input ready mask. */
  98.  
  99. #define     MCMD1       0x40    /*  Internal reset. */
  100. #define     MMODE       0x6e    /*  One stop bit,
  101.                                     even parity,
  102.                                     disable parity,
  103.                                     8 bit character length,
  104.                                     16x baud rate factor. */
  105. #define     MCMD2       0x37    /*  NA,
  106.                                     internal reset disabled,
  107.                                     rts enabled,
  108.                                     error reset enabled,
  109.                                     break disabled,
  110.                                     receive enabled,
  111.                                     dtr enabled,
  112.                                     send enabled. */
  113.  
  114. #endif
  115.  
  116. #ifdef      OCTAPORT
  117.  
  118. /*  Zilog 8530 serial port definition, including timer. */
  119.  
  120. #define     B0300       830
  121. #define     B1200       206
  122.  
  123. #define     MDATA       0x20    /*  Data port. */
  124. #define     MSTAT       0x21    /*  Status port. */
  125. #define     MCMND       0x22    /*  Command port. */
  126. #define     MOMASK      0x04    /*  Output ready mask. */
  127. #define     MIMASK      0x01    /*  Input ready mask. */
  128.  
  129. #define     MDEFSNUM    10
  130. static unsigned char MDEFS[MDEFSNUM] = {
  131.     0x09,   /*  Select wr09 - master interrupt control. */
  132.     0xc0,   /*      7-6: force hardware reset. 
  133.                     5-0: - */
  134.     0x0f,   /*  Select wr15 - external status/control. */
  135.     0x40,   /*      7-0: Disable all interrupts. */
  136.     0x04,   /*  Select wr04 - receiver and transmitter control. */
  137.     0x44,   /*      7-6: x16 clock,
  138.                     5-4: 0
  139.                     3-2: 1 stop bits,
  140.                     1-1: even parity,
  141.                     0-0: no parity. */
  142.     0x05,   /*  Select wr05 - transmitter control. */
  143.     0xea,   /*      7-7: assert dtr,
  144.                     6-5: transmit 8 bits,
  145.                     4-4: disable break,
  146.                     3-3: enable transmit. 
  147.                     2-2: 0
  148.                     1-1: assert rts. 
  149.                     0-0: - */
  150.     0x03,   /*  Select wr03 - receiver control. */
  151.     0xc1    /*      7-6: receive 8 bits,
  152.                     5-5: no autoenables,
  153.                     4-1: 0,
  154.                     0-0: enable receive. */
  155. };
  156.  
  157. #define     MBAUDNUM    10
  158. #define     MBAUDLOW    3       /*  Index to baudrate low byte. */
  159. #define     MBAUDHIGH   5       /*  Index to baudrate high byte. */
  160. static unsigned char MBAUD[MBAUDNUM] = {
  161.     0x0e,   /*  Select wr14- miscellaneous control. */
  162.     0x00,   /*      7-1: -
  163.                     0-0: Disable baudrate generator. */
  164.     0x0c,   /*  Select wr12 - low byte of baudrate constant. */
  165.     11,     /*      7-0: 1200 baud. */
  166.     0x0d,   /*  Select wr13 - high byte of baudrate constant. */
  167.     0,      /*      7-0: 1200 baud. */
  168.     0x0b,   /*  Select wr11 - clock mode control. */
  169.     0x56,   /*      7-7: no crystal,
  170.                     6-5: receive clock = baudrate generator output,
  171.                     4-3: transmit clock = baudrate generator output,
  172.                     2-2: -
  173.                     1-0: trxc-out=baudrate generator. */
  174.     0x0e,   /*  Select wr14 - miscellaneous control. */
  175.     0x03    /*      7-2: -
  176.                     1-1: pclk source of clock,
  177.                     0-0: Enable baudrate generator. */
  178. };
  179. #endif
  180.  
  181. /*  Hayes modem command strings. */
  182.  
  183. #define     ESCAPE_STR  "+++"
  184. #define     HANGUP_STR  "AT H0 \r"
  185. #define     DIAL_STR    "AT DT "
  186. #define     CR_STR      "\r"
  187.  
  188. /*  DOS interrupts. */
  189.  
  190. #define     DIR_IO      0x06    /*  DOS function request - direct i/o */
  191. #define     INPUT       0xff    /*  DOS function sub-request - accept */
  192.  
  193. /*  Flag values. */
  194.  
  195. #define     OK          ( 0)
  196. #define     ERROR       (-1)
  197. #define     WCEOT       (-2)
  198. #define     TIMEOUT     (-3)
  199. #define     EMPTY       (-4)
  200.  
  201. #define     SECSIZ      128     /*  Block size. */
  202.  
  203. #define     RETRYMAX    10
  204. #define     PATHLEN     64      /*  Send/receive file pathname length */
  205. #define     CLKMHZ      8       /*  CPU speed in Mhz */
  206. #define     TIMECON     311     /*  Constant to convert CLKMHZ to ticks.
  207.                                  */
  208.  
  209. #define     CONSTAT     2
  210. #define     CONIN       3
  211. #define     NORMAL      0x1c
  212. #define     ORIG        0x01
  213. #define     ANSWER      0x02
  214. #define     READY       0x5f
  215. #define     OPT300      0x20
  216. #define     OPT600      0x00
  217. #define     CLEAR       0x3f
  218. /*--------------------------------------------------------------------